iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

跟著 OXXO 一起學 Python系列 第 79

( Day 37.3 ) Python 串接 Firebase RealTime Database 存取資料

  • 分享至 

  • xImage
  •  

閱讀「建立 Firebase RealTime Database」和「設定 Firebase RealTime Database 安全規則」兩篇教學後,接下來就可以透過 Python 的 python-firebase 函式庫,實現串接 Firebase RealTime Database 的功能。

原文參考:串接 Firebase RealTime Database 存取資料

本篇使用的 Python 版本為 3.8.10,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

安裝 python-firebase 函式庫

參考 Firebase 官方文件「Installation & Setup for REST API」,使用 Özgür Vatanseverpython-firebase 函式庫,就能透過 REST API 進行資料的存取,但由於當初作者在發布函式庫時有問題,所以不能直接進行安裝 ( 會出現錯誤 ),因此要輸入下方安裝指令進行安裝 ( 有些 MacOS 作業系統會有問題,需要使用 xcode-select --install 更新 XCode 才能順利安裝 )。

pip install git+https://github.com/ozgur/python-firebase

Python 教學 - 串接 Firebase RealTime Database 存取資料 - 安裝 python-firebase 函式庫

Firebase RealTime Database 規則設定

進入「規則」頁籤,將規則修改成任何人都能讀取和寫入 ( 更多規則設定參考:設定 Firebase RealTime Database 安全規則 )。

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

Python 教學 - 串接 Firebase RealTime Database 存取資料 - Firebase RealTime Database 規則設定

存取資料的方法

安裝 python-firebase 函式庫後,就可以使用下列存取資料的方法:

方法 參數 說明
put() url, name, data 增加指定節點 ( 鍵 ) 的資料。
post() url, data 增加資料 ( 節點會自動產生 )。
get() url, name 讀取指定節點 ( 鍵 ) 的資料。
delete() url, name 刪除指定節點 ( 鍵 ) 的資料。

除了上述「同步」的方法,也可以使用「非同步」的方法存取資料,取出資料後執行 callback 函式內容:

方法 參數 說明
put_async() url, name, data, callback 使用非同步的方式增加指定節點 ( 鍵 ) 的資料。
post_async() url, data, callback 使用非同步的方式增加資料 ( 節點會自動產生 )。
get_async() url, name, callback 使用非同步的方式讀取指定節點 ( 鍵 ) 的資料。
delete_async() url, name, callback 使用非同步的方式刪除指定節點名稱 ( 鍵 ) 的資料。

put() 增加指定節點的資料

put() 方法可以增加指定節點名稱的資料,如果根目錄裡已經存在該名稱的節點,則會替換該節點裡的所有內容,put() 方法包含三個必要參數:

參數 說明
url 從根目錄開始的資料庫網址,例如 '/''/oxxo/'
name 節點名稱 ( 鍵 )。
data 存入的資料,可以是數字、文字、串列或字典格式,串列儲存後會被替換成字典 ( 使用索引值做為鍵 ),字典儲存後會根據鍵與值產生資料的樹狀結構。

下面的程式碼執行後,會在根目錄裡建立 oxxo 節點,值為 123。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)    # 初始化,第二個參數作用在負責使用者登入資訊,通常設定為 None
fdb.put('/','oxxo',123)

Python 教學 - 串接 Firebase RealTime Database 存取資料 - put()

下面的程式碼執行後,會在根目錄的 test 節點裡,裡建立 oxxo 節點,值為 123 ( 如果沒有 test 節點,會自動產生一個 test 節點 )。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.put('/test','oxxo',123)

Python 教學 - 串接 Firebase RealTime Database 存取資料 - put() 目錄

下面的程式碼執行後,會在根目錄裡建立 oxxo 節點,並使用字典格式增加其中的樹狀結構內容。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.put('/','oxxo',{'apple':100, 'orange':200})

Python 教學 - 串接 Firebase RealTime Database 存取資料 - put() 字典格式內容

下面的程式碼執行後,會在根目錄裡建立 oxxo 節點,添加的串列格式內容會被轉換成字典格式的樹狀結構。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.put('/','oxxo',[123,456,789])

Python 教學 - 串接 Firebase RealTime Database 存取資料 - put() 串列格式內容

post() 增加資料

post() 方法可以直接在指定的目錄中增加資料,資料會放在一個自動產生的節點中,post() 方法包含兩個必要參數:

參數 說明
url 從根目錄開始的資料庫網址,例如 '/''/oxxo/'
data 存入的資料,可以是數字、文字、串列或字典格式,串列儲存後會被替換成字典 ( 使用索引值做為鍵 ),字典儲存後會根據鍵與值產生資料的樹狀結構。

下面的程式碼執行後,會在根目錄加入一個 123 的值。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.post('/',123)

Python 教學 - 串接 Firebase RealTime Database 存取資料 - post()

下面的程式碼執行後,會在根目錄裡的 oxxo 節點中加入一個 123 的值。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.post('/oxxo',123)

Python 教學 - 串接 Firebase RealTime Database 存取資料 - post() 加入資料

下面的程式碼執行後,會在根目錄裡使用字典格式增加其中的樹狀結構內容。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.post('/',{'apple':100, 'orange':200})

Python 教學 - 串接 Firebase RealTime Database 存取資料 - post() 字典格式內容

get() 讀取指定節點的資料

get() 方法可以讀取指定節點的資料,包含兩個必要參數:

參數 說明
url 從根目錄開始的資料庫網址,例如 '/''/oxxo/'
name 節點名稱 ( 鍵 ),設定 None 可取得該節點所有資料。

以下圖的資料庫為例,資料庫中包含 fruit 和 oxxo 兩個節點。

Python 教學 - 串接 Firebase RealTime Database 存取資料 - get() 取得資料

執行下方程式碼,就會取得 oxxo 節點裡的資料。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
result = fdb.get('/','oxxo')
print(result)    # 123

下方的程式碼執行後,則會取得 fruit 裡 apple 節點的資料。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
result = fdb.get('/fruit','apple')
print(result)

將 name 參數設為 None,就能取得某個節點裡的所有資料,以下方的程式碼為例,就會取出根目錄裡所有資料,也由於資料使用字典格式,所以就能透過讀取字典的方式進行取值。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
result = fdb.get('/', None)
print(result)                     # {'fruit': {'apple': 100, 'orange': 200}, 'oxxo': 123}
print(result['fruit']['apple'])   # 100

delete() 刪除指定節點的資料

delete() 方法可以刪除指定節點的資料,包含兩個必要參數:

參數 說明
url 從根目錄開始的資料庫網址,例如 '/''/oxxo/'
name 節點名稱 ( 鍵 ),設定 None 可刪除該節點所有資料。

執行下方程式碼,就會刪除 oxxo 節點裡的資料。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.delete('/', 'oxxo')

將 name 參數設為 None,就能刪除某個節點裡的所有資料,以下方的程式碼為例,執行後就會刪除根目錄裡所有的資料 ( 等同清空資料庫 )。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
fdb.delete('/', None)

put_async() 使用非同步的方式增加指定節點的資料

put_async() 方法和 put() 方法相同,都可以增加指定節點的資料,但是 put_async() 是使用「非同步」的方式取得資料後,取得資料後還可以透過 callback 函式處理資料,以下方的程式碼為例,第一個 for 迴圈使用「同步」的 put() 方法,所以每次取值都需要「排隊」,然而第二個 for 迴圈裡的 put_async() 則不需要排隊,執行後觀察存檔的時間,會發現 put_async() 幾乎沒有什麼延遲。

延伸參考:for 迴圈字串格式化

from firebase import firebase
import time
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)

for i in range(10):
    fdb.put('/', f'a{i}', time.time())

for i in range(10):
    fdb.put_async('/', f'b{i}', time.time())

Python 教學 - 串接 Firebase RealTime Database 存取資料 - put_async()

搭配 callback 函式,就能在資料存入後執行特定的動作。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
def oxxo_callback(response):
    print('ok')
fdb.put_async('/', 'oxxo', 123, oxxo_callback)  # ok

post_async() 使用非同步的方式增加資料

post_async() 方法和 post() 方法相同,都可以增加指定節點的資料,但是 post_async() 是使用「非同步」的方式取得資料後,取得資料後還可以透過 callback 函式處理資料,以下方的程式碼為例,第一個 for 迴圈使用「同步」的 post() 方法,所以每次取值都需要「排隊」,然而第二個 for 迴圈裡的 post_async() 則不需要排隊,執行後觀察存檔的時間,會發現 post_async() 幾乎沒有什麼延遲。

延伸參考:for 迴圈time

from firebase import firebase
import time
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)

for i in range(10):
    fdb.post('/', time.time())

for i in range(10):
    fdb.post_async('/', time.time())

Python 教學 - 串接 Firebase RealTime Database 存取資料 - post_async()

搭配 callback 函式,就能在資料存入後執行特定的動作。

from firebase import firebase
url = 'https://XXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None)
def oxxo_callback(response):
    print('ok')
fdb.post_async('/', 123, oxxo_callback)  # ok

小結

如果可以透過 Python 串接 Firebase Realtime database,就能大幅發揮 Firebaase Realtime database 雲端資料庫的能力,不僅能存取資料,更能透過即時推播的功能,將更新的資料推播到網頁裡,做出相當方便的應用!

參考

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 37.2 ) Python 設定 Firebase RealTime Database 安全規則
下一篇
( DAy 38.1 ) Python 建立 LINE Channel
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言